iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
SideProject30

30 天用 Rust 打造 QR Code 製造機系列 第 27

Day 27 - 使用 Docker Buildx 建立 Image 並且上傳到 Docker Hub

  • 分享至 

  • xImage
  •  

這篇文章可能不是很多人會用到,但是如果開發系統是 Mac M1 的話,可能會遇到一些問題,所以還是寫了這篇文章來介紹一下。

Docker Buildx

Docker Buildx 是一個 Docker 的 plugin,可以用來建立 Image,並且可以建立多個平台的 Image,例如:Linux、Windows、Mac。其中 Mac 是分成兩種,一種是 x86_64,另一種是 arm64。所以如果是 Mac M1 或是 M2,又或者是 Windows 用 ARM CPU 的話,就可以使用 Docker Buildx 來建立 Image,以便讓你的 Image 可以有更好的相容性。

如果不確定自己的 docker 是什麼架構的話,可以在 Terminal 執行以下指令:

$ docker version

會看到類似以下的結果,可以去做區分:

新增 Docker Buildx

在 Terminal 執行以下指令,新增一個名為 buildx 的 builder。

$ docker buildx create --name buildx

然後執行以下指令,選擇這個 builder。

$ docker buildx use buildx

並看一下目前的 builder 有哪些架構可以使用。

$ docker buildx inspect --bootstrap

會看到類似以下的結果:

建立 Image

在建立 Image 之前,要先確定自己的 Docker Hub 帳號有沒有在 Docker Desktop 裡面登入,如果沒有的話,可以在 Terminal 執行以下指令:

$ docker login

沒有帳號的話記得去辦一下,接下來就可以開始建立 Image 了。

$ docker buildx build --platform linux/amd64,linux/arm64 -t <username>/<image-name>:<tag> --push .

但是可能會遇到以下的錯誤:

所以修正一下 Dockerfile:

# 使用 Ubuntu 作為基底來編譯程式
FROM ubuntu:latest as builder

# 設置非交互式環境變數以避免安裝時的提示
ENV DEBIAN_FRONTEND=noninteractive

# 安裝 Rust 和其他必要的依賴項
RUN apt-get update && \
    apt-get install -y curl build-essential && \
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y 

# 複製程式碼到容器中
WORKDIR /usr/src/qrcode-actix
COPY . .

# 使用 --release 建構程式
RUN /root/.cargo/bin/cargo build --release

# 使用一個輕量級的 image 來執行程式
FROM ubuntu:latest

# 設置非交互式環境變數以避免安裝時的提示
ENV DEBIAN_FRONTEND=noninteractive

# 安裝必要的共享庫
RUN apt-get update && apt-get install -y \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# 複製二進位檔到容器中
COPY --from=builder /usr/src/qrcode-actix/target/release/qrcode-actix /usr/local/bin/qrcode-actix

# 指定容器執行程式
CMD ["qrcode-actix"]

再重新打包一次並 push 到 Docker Hub 應該就沒問題,可以在 Docker Hub 上看到 Image 已經建立完成了。


上一篇
Day 26 - 後端部署(Docker)
下一篇
Day 28 - 部署到 DigitalOcean
系列文
30 天用 Rust 打造 QR Code 製造機30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言